超级简单的条件函数,轻松生成虚拟变量
本文作者:尚晨曦,河南大学经济学院
本文编辑:陈丹慧
技术总编:李婷婷
Python云端课程来啦!
寒雪梅中尽,春风柳上归。新的一年,正值开学之际,为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!原价2400元的Python编程培训课程,现在仅需100元即可通过腾讯课堂参与学习。详细培训大纲及报名方式请查看推文《Python云端课程福利大放送!0基础也能学~》,或点击文末阅读原文直接报名呦~另外,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!导读
在实证回归中,我们经常需要加入虚拟变量,一般情况下可以通过xi、tabulate或者generate和replace组合等命令快速生成。在我们之前的推文《如何创建虚拟变量》中也有过详细的介绍。但是如果我们遇到的是如下几种情况呢?
情况一:令省份中的北京,福建,广东,江苏,辽宁,山东,上海,天津,浙江为1,其余为0。
情况二:令数据中的1,3,5,7,8,13,14为1,其余为0。
情况三:令数据中大于等于3且小于等于5的值为1,其余为0。
对于这种没有规律的变量要摇身一变成虚拟变量,机智的你一定会想到用if命令来帮忙。
比如可以用下边的程序来实现以上三种情况中虚拟变量的创建:
*情况一
gen east = 1 if 省份=="北京"|省份=="福建"|省份=="广东"|省份=="江苏"|省份=="辽宁"|省份=="山东"|省份=="上海"|省份=="天津"|省份=="浙江"
replace east = 0 if east== .
*情况二
gen dum = 1 if number==1|number==3|number==5|number==7|number==8|number==13|number==14
replace dum = 0 if dum == .
*情况三
gen dum = 1 if 3<= number & number<=5
replace dum = 0 if dum == .
但是我们发现if的后缀非常长,容易出错,也不好检查。所以呢,小编今天给大家介绍三个Stata中超级简单好用的条件函数,不用if,分分钟生成虚拟变量。
01inlist()函数基本语法 | inlist(z,a,b,c,...) |
取值 | 如果z=a,b,c,...中的任何一个,则取值为1;否则为0。 |
规则 | 1、引用变量可以为实数或字符串。 2、若z为实数,则后续参数个数必须介于2-250;若z为字符,则后续参数的个数必须介于2-10。 3、inlist()函数还可以用&和|连接。 |
*第一步:生成一些模拟所需数据
clear all
input A B str10 城市
3 1 北京
1 1 上海
1 2 武汉
1 3 杭州
1 3 开封
2 2 北京
3 3 上海
1 1 开封
end
save E:\模拟数据.dta,replace //先进行保存,后续还会使用
*第二步:inlist()函数实操
gen dum1 = inlist(A,1,2) //如果变量A等于1或2,则dum1为1,否则dum1为0
gen dum2 = inlist(B,1,3) //如果变量B等于1或3,则dum2为1,否则dum2为0
gen dum3 = inlist(A,1,2) & inlist(B,1,3) //如果变量A等于1或2,同时变量B等于1或3,则dum3为1,否则dum3为0
gen dum4 = inlist(城市,"北京","上海") //如果城市为北京或者上海,则dum4为1,否则dum4为0,提醒:字符串要加英文引号
运行结果如下:
02inrange()函数
基本语法 | inrange(z,a,b) |
取值 | 如果a<=z<=b,则取值为1,否则为0。 |
规则 | 1、引用变量可以为实数或字符串值。 2、inrange(z,1,.)表示z取值从1到正无穷;inrange(z,.,.)表示z取值从负无穷到正无穷;inrange(z,.,1)表示z取值从负无穷到1。 |
*第一步:打开前文已保存的模拟数据
use E:\模拟数据.dta,clear
drop B 城市
*第二步:inrange()函数实操
gen dum1 = inrange(A,1,2) //如果变量A大于等于1且小于等于2,则dum1为1,否则dum1为0
gen dum2 = inrange(A,1,.) //如果变量A大于等于1,则dum2为1,否则dum2为0
gen dum3 = inrange(A,.,2) //如果变量A小于等于2,则dum3为1,否则dum3为0
结果如下:03cond()函数
基本语法 | cond(x,a,b[,c]) |
取值 | 如果x为真,取值为a;如果x为假,取值为b;如果x为缺失值,取值为c。 |
规则 | 1、引用变量可以为实数或字符串值。 2、若a为实数,b,c都要为实数;若a为字符串值,b,c都要为字符串值。 3、x不仅可以是个表达式,还可以是变量,甚至值。 |
最后一次练习:
*第一步:生成一些模拟所需数据
clear all
input A
3
1
1
0
.
2
3
1
end
*第二步:cond()函数实操
gen dum1 = cond(A>2,1,0,.) //如果表达式A>2为真,则dum1为1,如果表达式A>2为假,则dum1为0,如果表达式A>2缺失,则dum1为.,提醒:当A为缺失值时,系统默认.>2,即表达式为真,则dum1为1
gen dum2 = cond(A,1,0,.) //如果变量A不等于0,则dum2为1,如果变量A等于0,则dum2为0,如果变量A缺失,则dum2为.
gen dum3 = cond(missing(A),.,cond(A>2,1,0)) //如果变量A缺失,则dum3为.,如果变量A没有缺失,则dum3为执行cond(A>2,1,0)的结果
结果如下:
以上就是三个条件函数的使用方法了,是不是很简单呀!
话不多说,我们直接使用条件函数来看一下对于文章开头提到的三种情况怎么创建虚拟变量更为方便呢。程序如下:
*情况一
gen east=inlist(省份,"北京","福建","广东","江苏","辽宁","山东","上海","天津","浙江")
*情况二
gen dum=inlist(number,1,3,5,7,8,13,14)
*情况三
gen dum=inrange(number,3,5)
三行程序直接OK!
这个小捷径你学会了吗?你觉得条件函数还可以用在哪些场景呢?欢迎留言交流哦!对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
Python云端课程福利大放送!0基础也能学~
【爬虫实战】“我们,继续新故事”——爬取LOL英雄皮肤
“人像动漫化”—Python实现抖音特效
《唐探3》做错了什么?|来自150万字影评的证据
爬虫俱乐部年度总结|《请回答2020》
模糊匹配我只用这一招!
利用tushare获取财务数据
爬虫实战|Selenium爬取微信公众号标题与链接
强大的正则表达式
自动群发邮件(二)——附带附件
自动群发邮件--email和smtplib基本模块的使用
计算工作日的小能手——workdays
Seminar | 企业错报与银行贷款合同
小贴士:Markdown的基本语法
听说相貌也能量化 | 调用百度人脸检测API实现颜值打分
列出指定属性的变量|findname命令比ds命令
Json文件好帮手——JsonPath
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。